package com.hsurosy.infrastructure.persistent.repository;

import com.hsurosy.domain.task.model.entity.TaskEntity;
import com.hsurosy.domain.task.repository.ITaskRepository;
import com.hsurosy.infrastructure.event.EventPublisher;
import com.hsurosy.infrastructure.persistent.dao.ITaskDao;
import com.hsurosy.infrastructure.persistent.po.Task;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author Hsu琛君珩
 * @Date 2024-11-15 14:11
 * @Description 任务服务仓储实现
 * @Version: v1.0.0
 */
@Repository
public class TaskRepository implements ITaskRepository {

    @Resource
    private ITaskDao taskDao; // 任务数据访问层，用于操作任务数据库表
    @Resource
    private EventPublisher eventPublisher; // 事件发布器，用于发布消息

    /**
     * 查询未发送消息的任务列表
     * 该方法从数据库中查询所有状态为“未发送”或“发送失败”的任务，并转换为领域模型 `TaskEntity`。
     *
     * @return 未发送消息任务列表
     */
    @Override
    public List<TaskEntity> queryNoSendMessageTaskList() {
        List<Task> tasks = taskDao.queryNoSendMessageTaskList(); // 查询数据库中未发送的任务
        List<TaskEntity> taskEntities = new ArrayList<>(tasks.size()); // 创建存储领域模型对象的列表
        for (Task task : tasks) {
            // 将数据库对象转换为领域模型对象
            TaskEntity taskEntity = new TaskEntity();
            taskEntity.setUserId(task.getUserId());
            taskEntity.setTopic(task.getTopic());
            taskEntity.setMessageId(task.getMessageId());
            taskEntity.setMessage(task.getMessage());
            taskEntities.add(taskEntity);
        }
        return taskEntities; // 返回领域模型任务列表
    }

    /**
     * 发送消息
     * 通过事件发布器发送消息到指定的主题。
     *
     * @param taskEntity 任务实体对象，包含消息内容
     */
    @Override
    public void sendMessage(TaskEntity taskEntity) {
        eventPublisher.publish(taskEntity.getTopic(), taskEntity.getMessage()); // 发布消息到消息队列
    }

    /**
     * 更新任务状态为消息发送完成
     * 根据用户ID和消息ID更新数据库中任务的状态为“已完成”。
     *
     * @param userId    用户ID
     * @param messageId 消息ID
     */
    @Override
    public void updateTaskSendMessageCompleted(String userId, String messageId) {
        Task taskReq = new Task();
        taskReq.setUserId(userId);
        taskReq.setMessageId(messageId);
        taskDao.updateTaskSendMessageCompleted(taskReq); // 更新任务状态为完成
    }

    /**
     * 更新任务状态为消息发送失败
     * 根据用户ID和消息ID更新数据库中任务的状态为“发送失败”。
     *
     * @param userId    用户ID
     * @param messageId 消息ID
     */
    @Override
    public void updateTaskSendMessageFail(String userId, String messageId) {
        Task taskReq = new Task();
        taskReq.setUserId(userId);
        taskReq.setMessageId(messageId);
        taskDao.updateTaskSendMessageFail(taskReq); // 更新任务状态为失败
    }

}
